<?php

/**
 * Simple Site
 *
 * LICENÇA
 *
 * Este arquivo é parte do programa Simple Site
 *
 * Simple Site é um software livre; você pode redistribui-lo e/ou modifica-lo
 * dentro dos termos da Licença Pública Geral GNU como publicada pela
 * Fundação do Software Livre (FSF); na versão 2 da Licença, ou (na sua opnião)
 * qualquer versão.
 *
 * Este programa é distribuido na esperança que possa ser  util, mas
 * SEM NENHUMA GARANTIA; sem uma garantia implicita de ADEQUAÇÂO a qualquer
 * MERCADO ou APLICAÇÃO EM PARTICULAR. Veja a Licença Pública Geral GNU para
 * maiores detalhes.
 *
 * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
 * programa, se não, escreva para a Fundação do Software Livre(FSF) Inc.,
 * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * @category   Simple_Site
 * @package    Include
 * @subpackage Form
 * @license    http://www.gnu.org/licenses/gpl-2.0.html  GNU General Public License Version 2 (GPL 2)
 * @author     Alex Rodin <contato@alexrodin.com> 
 */
/**
 * Impedindo acessos diretos a esse arquivo
 */
defined('SIMPLE_SITE') || header('Location: http://alexrodin.com/');

/**
 * Classe com metodos para validação do formulário de contato
 *
 * @category   Simple_Site
 * @package    Include
 * @subpackage Form
 * @license    http://www.gnu.org/licenses/gpl-2.0.html  GNU General Public License Version 2 (GPL 2)
 * @author     Alex Rodin <contato@alexrodin.com>
 */
class Form_Validate
{

    /**
     * Array para guardar os erros
     *
     * @var array
     */
    public $errors = array();

    /**
     * Seta um erro para um elemento
     *
     * @param string $element Nome do elemento
     * @param string $message Mensagem de erro
     * @return  Email_Validate this
     */
    private function _setError($element, $message)
    {
        $this->errors[$element] = $message;

        return $this;
    }

    /**
     * Valida strings
     *
     * @param string $value O valor da requisição $_POST
     * @param string $elementName O nome do elemento do formulario que será validado
     * @param int $minSize Tamanho mínimo da string
     * @param int $maxSize Tamanho máximo da string
     * @return Email_Validate this
     */
    public function validateString($value, $elementName, $minSize = 5, $maxSize = 500)
    {
        if (strlen($value) < intval($minSize))
        {
            $this->_setError($elementName, "A quantidade mínima de caracteres permitido para esse campo é {$minSize} .");
        } else if (strlen($value) > intval($maxSize))
        {
            $this->_setError($elementName, "A quantidade máxima de caracteres permitido para esse campo é {$maxSize} .");
        }
        return $this;
    }

    /**
     * Valida o endereço de email
     *
     * @param string $email O email recebido pelo $_POST
     * @param string $elementName O nome do elemento do formulário que é validado por esse email
     * @return Email_Validate this
     */
    public function validateEmail($email, $elementName)
    {
        if (strlen($email) <= 0)
        {
            //Email vazio
            $this->_setError($elementName, "Por favor, entre com um endereço de e-mail");
        } else if (!preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/', $email))
        {
            //Email inválido
            $this->_setError($elementName, "Por favor, entre com um endereço de e-mail válido.");
        }
        return $this;
    }

    /**
     * Retorna os erros de um elemento específico ou null
     *
     * @param string $elementName Nome do elemento
     * @return string||null
     */
    public function getError($elementName)
    {
        if ($this->errors[$elementName])
        {
            return $this->errors[$elementName];
        } else
        {
            return null;
        }
    }

    /**
     * Exibe os erros como uma lista não ordenada html 
     *
     * @return string: A lista com os erros do formulário
     */
    public function displayErrors()
    {
        $errorsList = "<ul class=\"errors\">\n";
        foreach ($this->errors as $value)
        {
            $errorsList .= "<li>" . $value . "</li>\n";
        }
        $errorsList .= "</ul>\n";
        return $errorsList;
    }

    /**
     * Verifica se existem erros ou nao
     *
     * @return boolean
     */
    public function hasErrors()
    {
        if (count($this->errors) > 0)
        {
            return true;
        } else
        {
            return false;
        }
    }

    /**
     * Retorna a quantidade de erros existentes no formulario
     *
     * @return int
     */
    public function errorNumMessage()
    {
        return count($this->errors);
    }

}

?>
